<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // console.log(num1);  // 只写这一行  报 num1 is not defined 









        // console.log(num1);  // undefined 
        // var num1 = 100
        // console.log(num1); // 100 
        // function test1(){

        // }

            // function 函数名(){}
        // test1()


        // 为什么

        // 这种情况叫变量提升  


        // 函数预解析 
        // 什么是预解析?
        // 就是在代码执行以前  对代码进行通读并且解释  

        // 函数预解析 什么样的内容(不是所有内容都预解析)

        // 只是解析 如下内容  
        // 1.var 声明的变量  注意 有var 关键字  
        // 2 声明式的函数  function 函数名
       // 注意 赋值式的函数 按照 var 规则 预解析   

        // 硬盘  内存  CPU 
       // 如何解析 
       // 1 . var 声明的变量   仅仅是声明这个变量  但是不赋值 
       // 举例:  var num = 100;
       // 预解析阶段   准备一个容器  在内存开辟一个空间 起名叫num 但是什么都不放进去 
   
       //2 声明式的函数  
       // 对函数名提前进行声明 并且赋值一个函数  
       // 举例
       // function fn1(){}
       // 在栈内存开辟1个空间   起名叫fn1  
       // 然后把堆内存的地址放到 fn1中 


       // 注意事项 

       // 打开浏览器 只会解析全局代码  
        //不会解析函数内的代码 
        // 函数内的代码 会在函数调用的时候 先对函数体内的代码预解析 然后再执行 



        // 练习  


        // console.log(num);
        // var num = 100;
        // console.log(num);

        
        // 1 打开浏览器
        // 通读  
        // console.log(num);
        // var num = 100;
        // console.log(num);

        // 2.开始预解析  
        // 第一行  不预解析  
        // 第二行 预解析  声明一个变量 num 不赋值  
        // 第三行  不予解析   


        // 预解析结束  
        //  存在num这个变量 但是里边啥也没有  也就是说  里边是undefined


        // 预解析结束后 代码开始执行 
        // 第一行 console.log(num); 因为预解析结束 num 里边是undefined 
        // 所以第一行的结果是undefined 

        // 第二行  var num=100;  
        // 将100 给到了 num     num 由开始的undefined变成  100 

        // 第三行 console.log(num); 
        // num 变成了 100 所以把100输出到控制台




   </script>
</body>
</html>